package main

import (
	"fmt"
	"os"
	"os/exec"
	"time"
)

var ledacc = []int{ 1, 2, 3, 4 }
var ledproc *os.Process

func leddisplay() {
    var astat [4]string // 保存当前 LED 显示状态的数组

    // 创建并启动外部命令 "ledmat"
    cmd := exec.Command("ledmat")
    matpipe, _ := cmd.StdinPipe()
    cmd.Start()
    ledproc = cmd.Process

    // 初始化 LED 矩阵
    fmt.Fprintf(matpipe, "c\n") // 发送初始化命令
    for i := 0; i < 4; i++ {
        fmt.Fprintf(matpipe, "s %d 10 1\n", i*16+2) // 设置初始状态
        for j := 0; j < 10; j++ {
            fmt.Fprintf(matpipe, "s %d 10 1\n", i*16+3+j) // 设置更多初始状态
        }
        astat[i] = "P 0000000000 0000000000" // 初始化显示状态字符串
    }

    // 主循环，持续更新 LED 显示
    for {
        for i := 0; i < 4; i++ {
            // 获取累加器的状态
            s := accstat(ledacc[i] - 1)

            // 如果第一个字符发生变化
            if s[0] != astat[i][0] {
                if s[0] == 'M' {
                    // 如果新状态是 'M'，则设置相应的 LED 状态
                    fmt.Fprintf(matpipe, "s %d 10 0\n", i*16+2)
                    fmt.Fprintf(matpipe, "s %d 7 1\n", i*16+2)
                } else {
                    // 否则重置为默认状态
                    fmt.Fprintf(matpipe, "s %d 7 0\n", i*16+2)
                    fmt.Fprintf(matpipe, "s %d 10 1\n", i*16+2)
                }
            }

            // 更新前 10 个字符的状态
            for j := 0; j < 10; j++ {
                if s[j+2] != astat[i][j+2] {
                    fmt.Fprintf(matpipe, "s %d %d 1\n",
                        i*16+3+j, 10-(s[j+2]-'0')) // 设置新的 LED 状态
                    fmt.Fprintf(matpipe, "s %d %d 0\n",
                        i*16+3+j, 10-(astat[i][j+2]-'0')) // 重置旧的 LED 状态
                }
            }

            // 更新第 13 到 22 个字符的状态
            for j := 0; j < 10; j++ {
                if s[j+13] != astat[i][j+13] {
                    if s[j+13] == '1' {
                        fmt.Fprintf(matpipe, "s %d 14 1\n", i*16+3+j) // 设置 LED 状态为 1
                    } else {
                        fmt.Fprintf(matpipe, "s %d 14 0\n", i*16+3+j) // 设置 LED 状态为 0
                    }
                }
            }

            // 更新当前状态
            astat[i] = s
        }

        // 每隔 30 毫秒更新一次
        time.Sleep(30 * time.Millisecond)
    }
}
